www.gusucode.com > 基于Matlab的MIMO通信系统仿真 含报告;司中威;了解移动通信 > 基于Matlab的MIMO通信系统仿真 含报告;司中威;了解移动通信关键技术,了解数字通信系统仿真流程,实现基本的信道编译码、调制解调等通信模块。(好评如潮,课设拿满) 学习并实现MIMO空时处理技术 学习性能分析的思路和方法/mimo/matlab for mimo 2x2/lock_phase.m

    function [delta, theta] = lock_phase(K0, initial_phase, initial_delta, pilot_seq)
%% function [delta, ] = lock_phase(K0, initial_phase, initial_delta, pilot_seq)

%%%% Input
%  K0: nominal frequency (ie 2*Pi*Fc/Fs)
%  pilot_seq: pilot sequence (sinusoid)

%%%% Return 
%  delta: estimate of frequency offset (ie 2*Pi*F_offset/Fs)
%  theta: next phase

% DPLL parameters
alpha = .8;
loop_gain  = .15;

% Order of the FIR low pass filter
filter_order = 20;

% Cut off frequency at the center between Fc and 2*Fc
cut_off = 1.5*K0/(2*pi);

lpf = fir1(filter_order, cut_off);

data_len = length(pilot_seq);
in_seq = pilot_seq;
theta = initial_phase;


loop_filter_output = zeros(1, data_len + 1);
loop_filter_output(1) = initial_delta;

Ich = zeros(1, filter_order-1 + data_len); %%% insert filter_order-1 zeros before actual data
Qch = zeros(1, filter_order-1 + data_len);

out_seq = zeros(1, data_len);

pos = filter_order; 

for k = 1:data_len
    %    [cosval, sinval] = lookup_cos_sin(cos_tab, theta);
 
    Ich(pos) = cos(theta)*in_seq(k);
    Qch(pos) = sin(theta)*in_seq(k);
    %   Ich(pos) = cosval*in_seq(k);
    %   Qch(pos) = sinval*in_seq(k);    
    
    %%% Low Pass Filter
    I_filter_output = 0;
    Q_filter_output = 0;
    
    for i = 1:filter_order
        I_filter_output = I_filter_output + lpf(i)*Ich(pos-i+1);
        Q_filter_output = Q_filter_output + lpf(i)*Qch(pos-i+1);
    end
    
    phase_diff = -(Q_filter_output/I_filter_output);
    
    %%% Loop Filter
    loop_filter_output(k+1) = loop_filter_output(k)*alpha + (1-alpha)*phase_diff;

    loop_filter_output(k+1) = loop_filter_output(k+1)*loop_gain;
    
    out_seq(k) = loop_filter_output(k+1);    

    %%%% NCO
    theta = theta + K0 + loop_filter_output(k+1);
    %     if theta >= 2*pi
    %         theta = theta - 2*pi;
    %     elseif theta<0
    %         theta = theta + 2*pi;
    %     end
    twopi = 2*pi;
        
    while (theta>=twopi) 
        theta = theta - twopi;
    end
    while (theta<0) 
            theta = theta + twopi;
    end
    
    pos = pos + 1;
end


delta  = mean(loop_filter_output(data_len-256:data_len));
plot(out_seq);

%std(loop_filter_output(data_len-100:data_len))
%delta = loop_filter_output(data_len-31:data_len);